home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / WANDR401.ZIP / sources / help.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-10-23  |  5.4 KB  |  234 lines

  1. #include <stdio.h>
  2. #include <allegro.h>
  3. #include <string.h>
  4.  
  5. #include "wandat.h"
  6.  
  7. extern DATAFILE *data;           /* sprites */
  8. extern DATAFILE *datafonts;      /* font    */
  9. extern BITMAP *screen;
  10. extern int fontsel;              /* from display.c */
  11. extern int vga;
  12.  
  13. #define LEFT 50
  14. #define TOP  30
  15.  
  16. FILE *help_handle;
  17.  
  18. char * name[17] = {"explorer", "diamonds","exit","boulder",
  19.   "arrow","deflector","rock","dust","mine","time capsule",
  20.   "teleport","balloon","monster","baby monster",
  21.   "cage","bomb","thingy"};
  22.  
  23.  char icon[17] = {'@','*','X','O','<','/','#',':',
  24.    '!','C','T','^','M','S','+','B','~'};
  25.  
  26.  
  27. void draw_object_help (x,y, glyph)
  28.      int x, y;  /*x and y are now in display units */ 
  29.      char glyph;
  30. {
  31.   int spr;
  32.   int i,j,k;
  33.  
  34.  
  35.   switch (glyph)
  36.     {
  37.     case 'A':
  38.       spr = ARRIVE;
  39.       break;
  40.     case '>':
  41.       spr = ARROWR;
  42.       break;
  43.     case '<':
  44.       spr = ARROWL;
  45.       break;
  46.     case 'S':
  47.       spr = BABY_MONSTER;
  48.       break;
  49.     case '\\':
  50.       spr = BACKSLASH;
  51.       break;
  52.     case '^':
  53.       spr = BALLOON;
  54.       break;
  55.     case 'O':
  56.       spr = BOULDER;
  57.       break;
  58.     case '+':
  59.       spr = CAGE;
  60.       break;
  61.     case '*':
  62.       spr = DIAMOND;
  63.       break;
  64.     case ':':
  65.       spr = DUST;
  66.       break;
  67.     case 'X':
  68.       spr = EXIT;
  69.       break;
  70.     case '@':
  71.       spr = EXPLORER;
  72.       break;
  73.     case '!':
  74.       spr = MINE;
  75.       break;
  76.     case 'M':
  77.       spr = MONSTER;
  78.       break;
  79.     case '#':
  80.       spr = ROCK1;
  81.       break;
  82.     case '=':
  83.       spr = ROCK2;
  84.       break;
  85.     case '/':
  86.       spr = SLASH;
  87.       break;
  88.     case 'T':
  89.       spr = TELEPORT;
  90.       break;
  91.     case ' ':
  92.       spr = BLANK;
  93.       break;
  94.     case 'C':
  95.       spr = TIMECAPSULE;
  96.       break;
  97.     case 'B':
  98.       spr = BOMB;
  99.       break;
  100.     case '~':
  101.       spr = THINGY;
  102.       break;
  103.     default:
  104.       spr = BLANK;
  105.     }
  106.   draw_sprite (screen, data[spr].dat, x , y );
  107. }
  108.  
  109. draw_legend()
  110. {
  111. int i,x,y;
  112. rectfill(screen,LEFT/vga,TOP/vga,540/vga+(vga-1)*30,420/vga,26);
  113. text_mode(-1);
  114. for(i=0;i<17;i++)
  115.   {
  116.   x= (LEFT+40+150*(i/6))/vga;
  117.   y= (TOP +10+18*(i%6))/vga;
  118.   textout(screen,datafonts[fontsel].dat,name[i],x,y,4);
  119.   draw_object_help(x-30+20*(vga-1),y,icon[i]);
  120.   }
  121. }
  122.  
  123. display_help_page(ystart,nlines)
  124. {
  125. char buffer[120];
  126. int i;
  127. for (i=0;i<nlines;i++)
  128.   {
  129.   fgets(buffer,100,help_handle);
  130.   textout_right_justify(screen,datafonts[fontsel].dat,buffer,(LEFT + 10)/vga
  131.     ,500/vga+50*(vga-1),100/vga+(vga-1)*50,(TOP + ystart + i*15)/vga, 4);
  132.   }
  133.  
  134. textout(screen,datafonts[fontsel].dat,
  135. "Hit any key to continue or ESC to exit.",(LEFT + 10)/vga,(TOP+360)/vga,5);
  136. text_mode(-1);
  137. }
  138.  
  139. show_help()
  140. {
  141. help_handle = fopen("help.txt","rt");
  142. text_mode(-1);
  143. draw_legend();
  144. display_help_page(120,15);
  145. if(getch() == 27) goto clean_up;  /* ascii code for ESC */
  146. rectfill(screen,LEFT/vga,TOP/vga,540/vga+(vga-1)*30,420/vga,26);
  147. display_help_page(20,21);
  148. if(getch() == 27) goto clean_up;
  149. rectfill(screen,LEFT/vga,TOP/vga,540/vga+(vga-1)*30,420/vga,26);
  150. display_help_page(20,21);
  151. if(getch() == 27) goto clean_up;
  152. rectfill(screen,LEFT/vga,TOP/vga,540/vga+(vga-1)*30,420/vga,26);
  153. display_help_page(20,21);
  154. if(getch() == 27) goto clean_up; 
  155. rectfill(screen,LEFT/vga,TOP/vga,540/vga+(vga-1)*30,420/vga,26);
  156. display_help_page(20,21);
  157. if(getch() == 27) goto clean_up; 
  158. rectfill(screen,LEFT/vga,TOP/vga,540/vga+(vga-1)*30,420/vga,26);
  159. display_help_page(20,10);
  160. getch();
  161.  
  162. clean_up:
  163. fclose(help_handle);
  164. rectfill(screen,LEFT/vga,TOP/vga,600/vga,420/vga,0);
  165. text_mode(1);
  166. make_control_bar();
  167. }
  168.  
  169. char * about_text[] = {"     Wanderer by S. Shipway 1988.",
  170.   " ","Adapted for VGA graphics using the",
  171.   "DJGPP compiler and ALLEGRO game",
  172.   "development package, Nov. 1997.", " "
  173.   ,"The game and sources are public"
  174.   ,"domain.", " ","seymour@dgbt.doc.ca"};
  175.  
  176.  
  177. draw_about_window()
  178. {
  179. int i;
  180. rectfill(screen,(LEFT+100)/vga,(TOP+90)/vga,450/vga+(vga-1)*30,290/vga,26);
  181. text_mode(-1);
  182. for (i=0;i<10;i++)
  183.   textout(screen,datafonts[fontsel].dat,about_text[i],(LEFT + 110)/vga
  184.     ,(TOP + 100 + i*15)/vga, 4);
  185. text_mode(1);
  186. rest(300);
  187. while (kbhit()) getch(); /* clear keyboard buffer */
  188. getch();
  189. rectfill(screen,(LEFT+100)/vga,(TOP+90)/vga,450/vga,290/vga,0);
  190. }
  191.  
  192.  
  193. textout_right_justify(BITMAP *screen,FONT *font,char *string,int left,
  194. int right, int discrep, int top,int col)
  195. /* This function prints out text and tries to left justify it by */
  196. /* adding more space between words. It gives up for short lines. */
  197. /* Same input parameters as textout but you also need to specify */
  198. /* the right margin, right and the maximum discrepancy between   */
  199. /* the end of text and right margin to correct.                  */ 
  200. {
  201. char *tok[50];
  202. char *msg;
  203. char strbuf[100];
  204. int i;
  205. int length,minlen,dlength,last,space;
  206. int incr;
  207. float fleft,finc;
  208. length = text_length(font,string);
  209. minlen = 0;
  210. strcpy(strbuf, string);
  211. last = 0;
  212. for (tok[last] = strtok(strbuf," ");
  213.      tok[last];
  214.      tok[last] = strtok(0," ")) 
  215.   {
  216.   minlen += text_length(font,tok[last]);
  217.   last++ ; 
  218.   }
  219. space = right - left - minlen;
  220. if((space <= 0) || (space>discrep) || last <3)
  221.    {
  222.    textout(screen,font,string,left,top,col);
  223.    return;  /* can't justify */
  224.    }
  225. fleft = (float) left;
  226. finc = (float) space / (float) (last-1);
  227. for (i=0;i<last;i++)
  228.   {
  229.   textout(screen,font,tok[i],(int) fleft,top,col);
  230.   fleft += (float) text_length(font,tok[i]) + finc;
  231.   }
  232. }
  233.  
  234.